
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>项目线程池的参数都是怎么来的 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>项目线程池的参数都是怎么来的 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">对于CPU密集型任务，线程池的线程数通常如何设置？其背后的原理是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">对于CPU密集型任务，线程池的线程数应尽可能地设置为CPU核心数。这样做的原理是为了充分利用CPU资源，同时避免因线程过多导致不必要的线程上下文切换，从而降低系统性能。</div>
          </div>
          <div class="card-source">来源: 任务性质和数量</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">为什么在处理IO密集型任务时，线程池的线程数可以设置得比CPU核心数大得多？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为IO密集型任务（如文件读写、网络通信）会涉及大量的等待时间。当一个线程因等待IO操作而阻塞时，CPU会处于空闲状态。设置更多的线程可以充分利用这些CPU的空闲时间片来执行其他任务，从而提高整体的并发处理能力。</div>
          </div>
          <div class="card-source">来源: 任务性质和数量</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">当系统对响应性有较高要求时，任务队列的容量应该如何调整？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">如果系统需要快速响应请求，可能需要设置一个较小的任务队列容量。这样可以促使任务尽快被分配给线程执行，而不是在队列中长时间排队等待，从而缩短响应时间。</div>
          </div>
          <div class="card-source">来源: 响应性要求</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当线程池和任务队列都满了之后，有哪些常见的拒绝策略可供选择？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到的常见拒绝策略包括：AbortPolicy（默认策略，抛出RejectedExecutionException）、CallerRunsPolicy（让提交任务的调用线程自己执行该任务）、DiscardPolicy（直接丢弃新提交的任务）和DiscardOldestPolicy（丢弃任务队列中最旧的任务）。</div>
          </div>
          <div class="card-source">来源: 任务执行时间</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">线程池中的任务队列可以分为哪两种主要类型？它们的核心区别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要分为有界队列（如ArrayBlockingQueue）和无界队列（如LinkedBlockingQueue）。核心区别在于容量限制：有界队列有固定的容量，当队列满时新任务会被拒绝；而无界队列没有容量限制，理论上可以无限添加任务。</div>
          </div>
          <div class="card-source">来源: 任务队列类型和大小</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">在对线程池进行监控和调优时，需要关注哪些关键的性能指标？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">需要关注的关键性能指标包括：CPU利用率、内存利用率、线程执行时间、任务被拒绝的次数和原因、线程池的活动线程数以及任务队列的长度等。通过这些指标可以评估系统的负载和性能瓶颈。</div>
          </div>
          <div class="card-source">来源: 监控和调优需求</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">如果项目中的任务执行时间普遍较长，这对线程池的核心线程数和任务队列容量的设置有何影响？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">如果任务执行时间较长，可能需要增加核心线程数，以确保线程池中始终有足够的活跃线程来处理任务。同时，也可能需要增加任务队列的容量，以缓存更多等待执行的任务，缓解线程池的压力，避免任务被直接拒绝。</div>
          </div>
          <div class="card-source">来源: 任务执行时间</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">在初步设定线程池参数后，应该采取什么步骤来验证和优化这些参数？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在初步设定参数后，应当进行压测和性能评估。这包括执行负载测试来模拟不同负载下的系统表现，进行性能监控以收集关键指标（如CPU利用率、吞吐量等），并根据测试结果对参数进行调优，以达到最佳的性能和资源利用率。</div>
          </div>
          <div class="card-source">来源: 压测和性能评估</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">动态调整线程池参数的策略适用于什么场景？可以根据哪些信息进行调整？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">动态调整策略适用于任务负载动态变化的场景。可以根据任务队列的长度或者系统负载情况（如CPU利用率、内存利用率等性能指标）来动态地调整线程池的大小或任务队列的大小，以适应不同的工作负载，最大化资源利用率。</div>
          </div>
          <div class="card-source">来源: 任务队列类型和大小</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
